package main

import (
	"strings"
	"unicode"
)

// 先定义一个判断单词是否是合法token的函数
func isToken(s string) bool {
	count := 0
	for i, c := range s {
		if '0' <= c && c <= '9' {
			return false
		}
		if (c == '!' || c == ',' || c == '.') && i != len(s)-1 {
			return false
		}
		if c == '-' {
			count += 1
		}
		if c == '-' && ((i == 0 || i == len(s)-1) || count > 1 ||
			!unicode.IsLower(rune(s[i-1])) || !unicode.IsLower(rune(s[i+1]))) {
			return false
		}
	}
	return true
}

func countValidWords(sentence string) int {
	cnt := 0
	// 找到每一个单词
	for i, j := -1, 0; j < len(sentence); j++ {
		if sentence[j] == ' ' {
			// 如果i == j 是 ' '， 那么肯定往前走
			if j-i <= 1 {
				i++
				continue
			} else { // 取出单词
				// fmt.Println(sentence[i + 1:j])
				if isToken(sentence[i+1 : j]) {
					cnt += 1
				}
				i = j
			}
		}
		// 想要省去对最后这里得步骤，其实在字符串后面再加一个 没用字符，就用统一逻辑
		if j == len(sentence)-1 && sentence[j] != ' ' && isToken(sentence[i+1:j+1]) {
			cnt += 1
		}
	}
	return cnt
}

// 官方题解
func valid(s string) bool {
	hasHyphens := false
	for i, ch := range s {
		if unicode.IsDigit(ch) || strings.ContainsRune("!.,", ch) && i < len(s)-1 {
			return false
		}
		if ch == '-' {
			if hasHyphens || i == 0 || i == len(s)-1 || !unicode.IsLower(rune(s[i-1])) || !unicode.IsLower(rune(s[i+1])) {
				return false
			}
			hasHyphens = true
		}
	}
	return true
}

func countValidWords(sentence string) (ans int) {
	for _, s := range strings.Fields(sentence) { // 按照空格分割
		if valid(s) {
			ans++
		}
	}
	return
}
